const arr: Array<number> = [1, 2, 3, 4]
const arr1: number[] = [1, 2, 43, 5]

//元祖：规定数量和类型
const arr2: [string, number] = ['2', 1]

//枚举类型
enum po {
  a = 1,
  b = '2',
  c = 89
}

//函数类型  主要是参数类型限制  和  返回值限制
function fn(x: number, y: string): string {
  return x + y
}

//添加默认参数
function fn1(x: number, y: string): string {
  return x + y
}
//可选参数
function fn2(x: number, y?: string): string {
  return 'jdjd'
}

function fn3(n: number, ...d: number[]): string {
  return 'kd'
}
fn3(1, 2, 3, 4, 5, 6, 76)

function fn4(a: string): void {
  // 这样就是没有返回值的写法
  console.log('sdk')
}

/**
 * 类型断言, 类型断言并不是类型转换
 * 1 as关键词断言【推荐】
 * 2 <类型>断言
 */

const arrn: number[] = [1, 2, 4, 5]
const arrn2 = arrn.find((i) => i > 2) as number //as断言
const arrs = arrn2 * arrn2

const arrn4 = <number>arrn2 //<类型>断言
const arrs1 = arrn4 * arrn4

/**
 * 接口 interfaces
 * 用来预定对象的结构
 * 可以用 ,  或者 ; 隔开，也可以不用
 **/

interface IPost {
  title: number
  content: string
  isShow: boolean
  ally?: object //可选成员
  readonly x: string //只读成员  初始化过后不能再修改， 用该接口定义的对象这个属性不能进行修改
  [prop: string]: any //动态成员，属性值可能变化 ,如果any改成 string， 就会报错，需要所有属性的值都为string
}

const objx: IPost = {
  title: 1,
  content: 'a',
  isShow: false,
  x: 'dj'
}

// objx.x = 'dkk' //此时会报错，因为x为只读类型，不能进行修改

function getData(parame: IPost): IPost {
  return {
    title: 12,
    content: 'kksdk',
    isShow: false,
    x: 'dsk'
  }
}

/**
 * class的使用
 */

class Person {
  name: string
  other: object
  private age: number //私有属性 private
  public attr: string //公有属性 public
  protected x: object //受保护的属性，仅仅内部使用，外部不能访问,但是可以在子类中访问

  constructor(name: string, other?: object) {
    this.name = 'sdj'
    this.other = [1, 2, 3]
    // this.ohter = {a:12} //这样初始化也可以
  }
}

class Children extends Person {
  constructor(x: string) {
    super(x)
  }
}

//类使用接口
interface IPublicAttr {
  run(n: number): void
}

interface IEact {
  eat(x: string): string
}

class Animal implements IPublicAttr, IEact {
  run(n: number): void {}
  eat(x: string): string {
    return 'jsdk '
  }
}

function createStringArray(length: number, value: string): string[] {
  const arr = Array<string>(length).fill(value)
  return arr
}
